home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
msdos
/
mcpr
/
mcpmain.asm
< prev
next >
Wrap
Assembly Source File
|
1991-10-18
|
7KB
|
414 lines
page 95,132
;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
;§ §
;§ マルチカラム コンパクト プリント ユーティリティ §
;§ §
;§ Multicolumn Compact PRint utility MCPR.EXE Ver1.40 §
;§ ~ ~ ~~ §
;§ Copyright (C) by 福地 邦雄 1989-1990. All rights reserved. §
;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
public argv
public argc
public int24h
public intflg
public reprintflg
extrn getarg:near
extrn allocnambuf:near
extrn options:near
extrn allocprtbuf:near
extrn prtinit:near
extrn formprint:near
extrn freeprtbuf:near
extrn freenambuf:near
extrn newfile:near
extrn dosprint:near
extrn dosstdout:near
extrn abort:near
;
CR equ 0dh
LF equ 0ah
;
data segment para public 'DATA'
;
extrn nameptr:dword
extrn nameptroff:word
extrn nameptrseg:word
extrn fhandle:word
extrn errorno:word
;
argv dd 32 dup(?)
argc dw ?
;
filecount dw 0
;
psp label dword
pspoff dw 0
pspseg dw 0
;
devinfo dw ?
breakflag db ?
;
brkterm db 0ch
prtterm db 1ch,'$',22h,77h,1bh,'[; G',1ch,'(`',71h
prtrmsiz equ $-prtterm
brtrmsiz equ $-brkterm
;
prtend db 9
prtfilename db 40 dup(' ')
db ' print end',CR,LF
endmsgsz equ $-prtend
;
helpmsg label byte
db ' マルチカラム コンパクト プリント 1990/02/07 Ver1.40',CR,LF
db ' Copyright (C) by 福地 邦雄 1989-1990. All rights reserved.',CR,LF
db '使い方:MCPR <オプション> ファイル名・・・',CR,LF
db ' -xx xxカラムのマルチカラム印刷を行う -Wxx 1ページの桁数',CR,LF
db ' -Nxx xx桁の行番号を付ける -Kxx 1カラムの桁数',CR,LF
db ' -H<タイトル> タイトルを付ける 無指定時はファイル情報 -Gxx カラム間の空白桁数',CR,LF
db ' -P<A|B|C> ASM,BASIC,C のルールでカラム替えする -Txx タブサイズ',CR,LF
db ' -C 改ページコードを改行コードとして扱う -Lxx 1ページの印刷行数',CR,LF
db ' +xx-yy xxページからyyページまで印刷 -Rxx ページ替えを改行コードで行う',CR,LF
db ' +xx,zz xxページからzzページ分を印刷 xxは1ページの物理行数',CR,LF
db ' -Fx,y,<W|SL|SP|AP|AL|BP|BL> -Mxx,yy xxは左マージン yyは上マージン',CR,LF
db ' xは桁ピッチ yは行ピッチ 以後は用紙指定',CR,LF
db ' 1=136桁・10cpi 1=60行・6lpi ドットプリンタ W=136桁連帳 SL=80桁連帳 SP=A4縦',CR,LF
db ' 2=204桁・15cpi 2=75行・7.5lpi ページプリンタ AP=A4縦 AL=A4横',CR,LF
db ' 3=272桁・20cpi 3=90行・9lpi BP=B4縦 BL=B4横',CR,LF
db '桁ピッチ=1or2の時 行ピッチ=3は指定できない 用紙によって印刷行桁の初期値は変わる',CR,LF
db ' -? 標準書式の設定値を表示する -Ux ホッパーユニット指定',CR,LF
db ' ',CR,LF
hlpmsgsiz equ $-helpmsg
;
paperemp db '用紙がありません.<書込み中> デバイス $'
writing db '書込みができません. デバイス $'
selectopt db '中止<A>, もう一度<R>, 無視<I>, ページ打ち直し<P>? $'
newline db CR,LF,'$'
data ends
;
code segment para public 'CODE'
assume cs:code,ds:data,ss:stack
int24h dd 0
intflg db 2 dup(0)
reprintflg dw 0
dataseg dw data
db 6 dup(0)
;
entry proc far
;
mov ax,seg data
mov es,ax
mov es:pspseg,ds
mov ax,ds:[12h]
mov word ptr cs:int24h,ax
mov ax,ds:[14h]
mov word ptr cs:int24h+2,ax
;
mov di,offset argv
call getarg
push es
pop ds
mov argc,ax
jz noargs
;
call allocnambuf
call options
jz noprint
mov filecount,ax
;
call allocprtbuf
call sysalternate
prtloop:
sub filecount,1
jb endprint
;
mov ax,3d40h
push ds
lds si,nameptr
lds dx,[si]
int 21h
pop ds
jc nextfile
;
call newfile
call formprint
;
mov ah,3eh
mov bx,fhandle
int 21h
call prtendmsg
nextfile:
add nameptroff,4
jmp short prtloop
endprint:
call sysrestore
call freeprtbuf
noprint:
call freenambuf
mov ax,4c00h
int 21h
;
noargs:
mov errorno,0
mov cx,hlpmsgsiz
mov dx,offset helpmsg
jmp abort
;
entry endp
;
sysalternate proc
;
mov ax,3300h
int 21h
mov breakflag,dl
;
mov ax,3301h
mov dl,1
int 21h
;
mov ax,4400h
mov bx,4
int 21h
mov dh,0
mov devinfo,dx
;
mov ax,4401h
mov bx,4
or dl,20h
int 21h
;
push ds
mov ax,2523h
mov dx,offset int23proc
push cs
pop ds
int 21h
;
mov ax,2524h
mov dx,offset int24proc
int 21h
pop ds
;
call prtinit
;
ret
;
sysalternate endp
;
sysrestore proc
;
mov ax,3301h
mov dl,breakflag
int 21h
;
mov dx,offset prtterm
mov cx,prtrmsiz
call dosprint
;
mov ax,4401h
mov bx,4
mov dx,devinfo
int 21h
;
ret
;
sysrestore endp
;
prtendmsg proc
;
cld
xor ax,ax
mov cx,-1
les di,nameptr
les di,es:[di]
mov si,di
repne scasb
not cx
dec cx
mov bx,40
sub bx,cx
jae nonameover
mov bx,0
mov cx,40
nonameover:
push es
mov di,ds
mov es,di
pop ds
mov di,offset prtfilename
rep movsb
mov al,' '
mov cx,bx
rep stosb
mov di,es
mov ds,di
mov cx,endmsgsz
mov dx,offset prtend
call dosstdout
ret
;
prtendmsg endp
;
int23proc proc
;
test cs:intflg,1
jz ctrlc
iret
ctrlc:
or cs:intflg,1
test cs:intflg,40h
jnz fatalexit
;
mov ds,cs:dataseg
;
mov si,offset brkterm
mov cx,brtrmsiz
termoutloop:
mov ah,5
mov dl,[si]
int 21h
inc si
loop termoutloop
;
mov ax,4401h
mov bx,4
mov dx,devinfo
int 21h
fatalexit:
mov ax,4c01h
int 21h
;
int23proc endp
;
int24proc proc
;
test cs:intflg,80h
jnz int24old
test ah,8
jz int24old
cmp di,9
jb int24old
cmp di,0ah
ja int24old
push bp
mov bp,sp
cmp byte ptr [bp+9],40h
jne intdefault
cmp word ptr [bp+0ah],4
jne intdefault
push ds
mov ds,[bp]
test byte ptr [si+5],80h
pop ds
jnz intfatal
intdefault:
pop bp
int24old:
or cs:intflg,80h
jmp cs:int24h
;
intfatal:
pop bp
or cs:intflg,0c0h
push ax
push bx
push cx
push dx
push si
push di
push bp
push ds
push es
mov bp,sp
;
mov ds,cs:dataseg
cmp di,9
jne writeerr
mov dx,offset paperemp
jmp short guide1out
writeerr:
mov dx,offset writing
guide1out:
mov ah,9
int 21h
;
mov es,[bp+4]
lea si,[si+10]
mov cx,8
devnameloop:
mov ah,2
mov dl,es:[si]
test dl,dl
jz newlines
cmp dl,20h
je newlines
int 21h
inc si
loop devnameloop
newlines:
mov ah,9
mov dx,offset newline
int 21h
questions:
mov ah,9
mov dx,offset selectopt
int 21h
;
mov ax,0c01h
int 21h
;
push ax
mov ah,9
mov dx,offset newline
int 21h
pop ax
;
xor ah,ah
cmp al,'I'
je oprdefault
cmp al,'i'
je oprdefault
inc ah
cmp al,'R'
je oprretry
cmp al,'r'
je oprretry
inc ah
cmp al,'A'
je oprdefault
cmp al,'a'
je oprdefault
inc ah
cmp al,'P'
je oprpagehead
cmp al,'p'
je oprpagehead
;
jmp questions
;
oprpagehead:
mov cs:reprintflg,-1
oprretry:
and cs:intflg,03fh
oprdefault:
mov [bp+10h],ah
;
pop es
pop ds
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
iret
;
int24proc endp
;
code ends
;
stack segment para stack 'STACK'
db 400h dup(?)
stack ends
end entry